[UPDATE] Amazon CloudFrontでクライアントのTLSバージョンを確認できるCloudFront-Viewer-TLSヘッダが利用可能になりました
はじめに
清水です。本日お届けするアップデート情報はこちら!AWSのCDNサービスであるAmazon CluodFrontでクライアントのTLSバージョンと暗号スイートを確認できるCloudFront-Viewer-TLSヘッダが利用可能になりました。2022/05/23付でポストされたアップデート情報になります。
- Amazon CloudFront now provides TLS version and cipher suite in CloudFront-Viewer-TLS-header
- Amazon CloudFront が、CloudFront-Viewer-TLS-header で TLS バージョンと暗号スイートの提供を開始
これまでもCloudFrontではディストリビューション単位でSecurity policyとしてビューア(クライアント)とCloudFront間の最小のTLSプロトコルと暗号スイートを指定することが可能でした。またアクセスログでビューアがリクエスト時に利用したTLSプロトコルと暗号スイートを確認することも可能です。今回これらに加え、リクエスト時のヘッダでTLSプロトコルバージョンと暗号スイートの確認ができるようになったわけです。リクエストに対してリアルタイムにTLSバージョンや暗号スイートを確認して処理が行えますね。オリジン側でヘッダの内容を参照するほか、CloudFront FunctionsやLambda@EdgeでCloudFront-Viewer-TLSヘッダを参照して指定のTLSバージョン未満であればアクセスを制限する、といったことが可能になります。
本エントリではこのCloudFront-Viewer-TLSヘッダの設定ならびにオリジンサーバでの確認をしてみたのでまとめてみます。
CloudFront-Viewer-TLSヘッダを確認してみた
それでは実際にCloudFrontでCloudFront-Viewer-TLSヘッダをオリジンに転送するように設定し、このヘッダ内容を確認してみます。
Origin request policyの作成
まずはOrigin request policyを作成します。CloudFrontのマネジメントコンソール、[Create origin request policy]ボタンから進みます。Origin request settingsのHeadersの項目で、All viewer headers and the following CloudFront headers
を選択、続くAdd headerの項目ではCloudFront-Viewer-Addressを選択します。
Distributionの作成
Origin request policyの作成が作成できたら、続いてこちらを使用するCloudFront Distributionを作成していきます。作成時、Cache key and origin requestsの項目ではLegacy cache settingsではなくCache policy and origin request policyを選択します。使用するポリシーは先ほど作成したOrigin request policyで作成したポリシー(今回は「Custom-CloudFrontViewerTLSHeader」という名称)を選択します。今回は動作検証のため、Cache policyは「CachingDisabled」としました。
今回、オリジンはEC2インスタンスで、Public IPv4 DNSを使って指定しています。オリジンへの通信はHTTPのみ(HTTPS未使用)です。
CloudFront側ではCNAMEを指定、証明書を設定してHTTPSアクセス可能としています。Security policyについてはTLSバージョンなどの確認のためTLSv1.1_2016
を選択しています。
オリジンとなるEC2インスタンス上ではApache + PHPの環境を準備、以下のindex.phpのコードを配置してヘッダの内容を出力するようにします。
<?php foreach (getallheaders() as $name => $value) { echo "<p>"; echo "$name: $value\n"; echo "</p>"; } ?>
CloudFront-Viewer-TLSヘッダの確認
それでは実際にCloudFrontに設定したドメイン名(cfvtls.example.net)にアクセスしてみます。まずはChromeブラウザでのアクセスです。以下のように、CloudFront-Viewer-TLS: TLSv1.3:TLS_AES_128_GCM_SHA256
とCloudFront-Viewer-TLS
ヘッダが確認できますね。
続いてcurl
コマンドでTLSのバージョンを指定して確認してみましょう。--tls-max
オプションで許容できる最大のTLSバージョンを指定しています。
まずはTLSバージョンを指定しない状態です。CloudFront-Viewer-TLS: TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256
というヘッダの内容が確認できますね。この検証した環境のcurlコマンドでは利用できる最大のTLSバージョンは1.2ということになります。
% curl https://cfvtls.example.net/ <p>Host: cfvtls.example.net </p><p>User-Agent: curl/7.64.1 </p><p>X-Amz-Cf-Id: qdnJxxxxxxxxxxxxxxxxxxxxxxxxqzlBQ9v_e-DJ-mGLHPW-T8JXJQ== </p><p>Connection: Keep-Alive </p><p>Via: 2.0 0706xxxxxxxxxxxxxxxx2676497fddf2.cloudfront.net (CloudFront) </p><p>X-Forwarded-For: xxx.xxx.xxx.xxx </p><p>Accept: */* </p><p>CloudFront-Viewer-TLS: TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256 </p>
--tls-max 1.2
を指定しても同様の結果となります。(--tls-max 1.3
オプションではサポート外である旨、警告がありました。)
% curl --tls-max 1.2 https://cfvtls.example.net/ <p>Host: cfvtls.example.net </p><p>User-Agent: curl/7.64.1 </p><p>X-Amz-Cf-Id: wfUWxxxxxxxxxxxxxxxxxxxxxxxx-QQeoS0N0mWfxi8OL1YX883zrA== </p><p>Connection: Keep-Alive </p><p>Via: 2.0 823exxxxxxxxxxxxxxxx23cb55639cd2.cloudfront.net (CloudFront) </p><p>X-Forwarded-For: xxx.xxx.xxx.xxx </p><p>Accept: */* </p><p>CloudFront-Viewer-TLS: TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256 </p>
--tls-max 1.1
を指定してみました。CloudFront-Viewer-TLS
ヘッダでTLSv1.1:ECDHE-RSA-AES128-SHA
という内容が確認できますね。
% curl --tls-max 1.1 https://cfvtls.example.net/ <p>Host: cfvtls.example.net </p><p>User-Agent: curl/7.64.1 </p><p>X-Amz-Cf-Id: isjZxxxxxxxxxxxxxxxxxxxxxxxxiCH5j89HXkhwz2_9QBq_9YGwqA== </p><p>Connection: Keep-Alive </p><p>Via: 2.0 532cxxxxxxxxxxxxxxxx6bbd88ba55e2.cloudfront.net (CloudFront) </p><p>X-Forwarded-For: xxx.xxx.xxx.xxx </p><p>Accept: */* </p><p>CloudFront-Viewer-TLS: TLSv1.1:ECDHE-RSA-AES128-SHA </p>
まとめ
AWSのCDNサービスAmazon CloudFrontで新たに追加されたCloudFront-Viewer-TLSヘッダを確認してみました。今回はオリジン側でヘッダ情報を参照するかたちでしたが、CloudFront FunctionsやLambda@EdgeでCloudFront-Viewer-TLSヘッダを参照し、指定のTLSバージョン以下であればアクセスを制限する、といった使い方が案内されています。これまではSecurity policyで設定を行い、指定したTLSバージョン未満などの場合は接続に失敗してしまうかたちだったのが、例えばアクセスを制限しながらTLSバージョンのアップデートを促すなどより柔軟な対応ができそうですね。
なお、最近CloudFrontに追加されている他のヘッダと同様(例えばCloudFront-Viewer-Addressヘッダなど)、Legacy cache settingsでは利用できずOrigin request poilcyとして設定する必要がある点に留意しておきましょう。